/**
 * 
 */
package co.com.unmasters.pokerbot.core;

import java.util.ArrayList;

import pruebas.ParaProbar;

import co.com.unmasters.pokerbot.bot.Participante;
import co.com.unmasters.pokerbot.test.ParticipanteMachete;
import co.com.unmasters.pokerbot.test.Participante_1;
import co.com.unmasters.pokerbot.test.Participante_2;
import co.com.unmasters.pokerbot.test.Participante_3;
import co.com.unmasters.pokerbot.test.Participante_4;
import co.com.unmasters.pokerbot.test.Participante_5;
import co.com.unmasters.pokerbot.util.Logger;


/**
 * Torneo
 * @author fbonilla
 */
public class Torneo {
    /**
     * @param args the command line arguments
     */
	public static ArrayList<Participante> participantes ;
	 
    public static void main(String[] args) {
        int dinero = 1000;
        int apuesta = 0;
        // TODO code application logic here
        Mesa mesa = new Mesa();
        
        Logger.println(Torneo.class, "NUEVO TORNEO MASTERUN", Logger.NIVEL_LOG_JUEGO);
        Logger.println(Torneo.class, "Pozo: " + dinero, Logger.NIVEL_LOG_JUEGO);
        
        participantes = new ArrayList<Participante>();
        participantes.add(new ParticipanteMachete());
        participantes.add(new Participante_1());
        participantes.add(new Participante_2());
        participantes.add(new Participante_3());
        participantes.add(new Participante_4());
        participantes.add(new Participante_5());

        /** LOG para el inicio de mesa*/
        Logger.println(Torneo.class, "N?mero de Participantes: " + participantes.size(), Logger.NIVEL_LOG_JUEGO);
        for (Participante participante : participantes) {
            Logger.println(Torneo.class, "-" + participante.miNick(), Logger.NIVEL_LOG_JUEGO);
        }
        
        mesa.iniciarmesa(participantes.size(), dinero);
        mostrarDineroJugadoresMesa(mesa);
        copiarNickParticipanteJugador(mesa);
        int [] ordenTurnos = new int[participantes.size()];
        apuesta = 2;/// la apuesta inicial
        int turno = 0;
        ordenTurnos  = asignarOrdenTurnos(ordenTurnos);
        boolean primeraRonda = true;
        while ( !verificarUnSoloJugadorConDinero( mesa)  ) {
			int dineroParaGanador = 0;
			if(  !primeraRonda && mesa.getEstadoMesa() > mesa.RIVER ){
				mesa.nuevaRonda();
                apuesta = apuesta+2;
                ordenTurnos  = asignarOrdenTurnos(ordenTurnos);
			}
			mesa.getCartasComunes().addAll(Dealer.repartirCartasComunes( mesa.getCartas(), mesa.getEstadoMesa()));
	        
			primeraRonda  = false;
			//mostrarDineroJugadoresMesa(mesa);
			//for (int m = 0; m < 4; m++) {
                Logger.println(Torneo.class, "Estado mesa:" + mesa.getEstadoMesa(), Logger.NIVEL_LOG_ESTADO);

                for (int k = 0; k < mesa.getCartasComunes().size(); k++) Logger.println(Dealer.class,  mesa.getCartasComunes().get(k).toString(), Logger.NIVEL_LOG_JUEGO);
				for (int i = 0; i < participantes.size(); i++) {
					turno = ordenTurnos[i];
					Participante participante = participantes.get( turno );

					if (mesa.getJugadores().get(turno).getDinero() > 0) {
						int respuesta = participante.responderApuesta(mesa
								.getCartasComunes(), mesa.getJugadores().get(turno)
								.getCartas(), apuesta, mesa.getJugadores().get(turno).getDinero());
						mesa.getJugadores().get(turno).setRespuesta(respuesta);
						if ( respuesta < apuesta ) {
							if ( turno == ordenTurnos[ordenTurnos.length-1] || turno == ordenTurnos[ordenTurnos.length-2]      ) {
								if (mesa.getJugadores().get(turno).getDinero() > apuesta) {
									dineroParaGanador += apuesta;
									mesa.getJugadores().get(turno).setDinero(
											mesa.getJugadores().get(turno)
													.getDinero()
													- apuesta);
								} else {
									dineroParaGanador += mesa.getJugadores()
											.get(turno).getDinero();
									mesa.getJugadores().get(turno).setDinero(0);
								}
							}
						}
					} else {
						mesa.getJugadores().get(turno).setRespuesta(0);
					}
					//mostrarDineroJugadoresMesa(mesa);
					mesa.setApuesta( apuesta );
				}
				mesa.setEstadoMesa(mesa.getEstadoMesa()+1);
			//}
			//  ParaProbar probatales = new ParaProbar();
			//  probatales.probatingMEtodoObtenerRepeticiones();
			mostrarDineroJugadoresMesa(mesa);
			Jugador jugadorGanador = Dealer.ganador(mesa);
			jugadorGanador.setDinero(jugadorGanador.getDinero()
					+ dineroParaGanador);
			quitarDineroJugadorCheckPerdieron(mesa, jugadorGanador, apuesta * 2);
			Logger.println(Torneo.class, "GANADOR: "+ jugadorGanador.getId()+" "
					+ participantes.get(jugadorGanador.getId()).miNick(), Logger.NIVEL_LOG_JUEGO);
			mostrarDineroJugadoresMesa(mesa);
		}
    }
    public static void mostrarDineroJugadoresMesa ( Mesa mesa ){
    	for (Jugador unJugador : mesa.getJugadores() ){
    	    Logger.println(Torneo.class, "Dinero: " + unJugador.getNickParticipanteJugador() + ":" + unJugador.getDinero(), Logger.NIVEL_LOG_JUEGO);
    	}
    }
    public static void copiarNickParticipanteJugador( Mesa mesa){
    	for (Jugador unJugador : mesa.getJugadores() ){
    		unJugador.setNickParticipanteJugador(participantes.get(unJugador.getId()).miNick());
    	}
    }
    public static void quitarDineroJugadorCheckPerdieron( Mesa mesa, Jugador jugadorGanador, int apuesta ){
    	int dineroParaGanador = 0;
    	for (Jugador unJugador : mesa.getJugadores() ){
    		if ( unJugador.getRespuesta() == apuesta && unJugador.getId() != jugadorGanador.getId()){
    			if ( unJugador.getDinero() > apuesta  ) {
					unJugador.setDinero(unJugador.getDinero() - apuesta);
					dineroParaGanador += apuesta;
				} else {
					dineroParaGanador += unJugador.getDinero();
					unJugador.setDinero(0);
				}
    		}
    	}
    	jugadorGanador.setDinero( jugadorGanador.getDinero() + dineroParaGanador  );
    }
    public static boolean verificarUnSoloJugadorConDinero(Mesa mesa){
    	int contador = 0;
    	for (Jugador unJugador : mesa.getJugadores() ){
    		if ( unJugador.getDinero() > 0 ){
    			contador++;
    		}
    	}
    	if ( contador == 1 ){
    		return true;
    	} else return false;
    }
    public static int[] asignarOrdenTurnos( int [] ordenTurnos ){
    	if (  ordenTurnos[0]+ ordenTurnos[1] > 0 ) {
			for (int i = 0; i < ordenTurnos.length; i++) {
				ordenTurnos[i] = ++(ordenTurnos[i]) % ordenTurnos.length;
			}
		} else  {
			for (int i = 0; i < ordenTurnos.length; i++) {
				ordenTurnos[i] = i;
			}
		}
		return ordenTurnos;
    }
    
}